package editor.graphics;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.MouseInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Float;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;

import editor.dxf.DxfModel;
import editor.main.EditorViewer;
import editor.main.FloorPanel;
import editor.main.LandmarkPanel;
import editor.main.Memento;
import editor.main.PortalPanel;
import editor.main.SpacePanel;
import editor.modelo.EditorFloor;
import editor.modelo.EditorPortal;
import editor.modelo.EditorSpace;
import editor.modelo.LandMark;
import editor.modelo.ModelUtilities;
import editor.modelo.Portal;
import editor.modelo.Space;

public class EditorMapa extends JPanel {

	/**La dif que tienen que tener 2 puntos para alinearse**/
	private static final int alignEpsilon = 4;
	private static int MIN_ZOOM = 25;
	private static int MAX_ZOOM = 800;
	public enum Estado {
		inactivo, agregarEspacio, agregarPuntos, correrCamara, drag, agregarLandMark
	};

	public enum Direccion {
		arriba, abajo, izquierda, derecha
	};

	private static final int TAMANIO_ORIGEN = 8;
	private static final Color COLOR_ORIGEN = new Color(150, 150, 150);
	private static final Color COLOR_FONDO = new Color(248, 248, 255);
	private static final long serialVersionUID = 1L;
	private Memento mem = new Memento(50);

	private EditorFloor pisoEnEdicion;
	public Dibujable fondo;
	private Painter painter = new Painter2D();
	private List<EditorFloor> pisosVisibles = new ArrayList<EditorFloor>();
	private Estado estado_ = Estado.inactivo;
	private EditorEventHandler eeh;
	private Object editing;
	float origenX = 003;
	float origenY = 600;
	Seleccion seleccion = new Seleccion();
	private JPanel panel_1;
	private JPopupMenu popupMenu_1;
	private JMenuItem mntmEditar_1;

	
	// parametros de la camara
	private float zoom = 1.0f;

	private List<DxfModel> fondos;
	
	public EditorFloor getPisoEnEdicion(){
		return pisoEnEdicion;
	}

	public float getZoom() {
		return zoom;
	}
	
	/**
	 * Cambia el zoom en un dado %.
	 * Subir 100% no duplica, sino que suma 1 aumento.
	 * por ej de 1.1 a 2.1.
	 * @param offset
	 */
	public void adjustZoom(int offset){
		this.zoom += (offset/50.0);
		if(zoom> MAX_ZOOM/100.0) zoom = (float) (MAX_ZOOM/100.0);
		if(zoom< MIN_ZOOM/100.0) zoom = (float) (MIN_ZOOM/100.0);
		
	}

	public EditorMapa() {
		
		this.setFocusable(true);
		this.setFocusCycleRoot(true);
		this.requestFocus();

		popupMenu_1 = new JPopupMenu();

		mntmEditar_1 = new JMenuItem("Editar...");
		mntmEditar_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				mem.save(pisoEnEdicion);
				editarSeleccionado();

			}
		});
		popupMenu_1.add(mntmEditar_1);
		setLayout(new BorderLayout(0, 0));

		addKeyListener(new KeyAdapter() {

			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
					seleccion.vaciarPuntos();
					seleccion.vaciarSpaces();
					seleccion.vaciarPortals();
					setEstado(Estado.inactivo);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_DELETE) {
					borrarSeleccionado();
				}
				if (e.getKeyCode() == KeyEvent.VK_Z && e.isControlDown()) {
					seleccion.vaciar();
					mem.restore(pisoEnEdicion);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_D && e.isControlDown()) {
					pegarSeleccion();
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_O && e.isControlDown()) {
					alinearTodo(alignEpsilon);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_P) { //creo un portal sin linkear
					agregarUnlinkedPortal();
					repaint();
				}
				///////////////Muevo el fondo (DXF)
				if (e.getKeyCode() == KeyEvent.VK_UP && e.isAltDown()) {
					desplazarFondo(Direccion.arriba);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_DOWN && e.isAltDown()) {
					desplazarFondo(Direccion.abajo);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_LEFT && e.isAltDown()) {
					desplazarFondo(Direccion.izquierda);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.isAltDown()) {
					desplazarFondo(Direccion.derecha);
					repaint();
				}
				///////////////Muevo el piso completo
				if (e.getKeyCode() == KeyEvent.VK_UP && e.isControlDown()) {
					desplazarPisoSeleccionado(Direccion.arriba);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_DOWN && e.isControlDown()) {
					desplazarPisoSeleccionado(Direccion.abajo);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_LEFT && e.isControlDown()) {
					desplazarPisoSeleccionado(Direccion.izquierda);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.isControlDown()) {
					desplazarPisoSeleccionado(Direccion.derecha);
					repaint();
				}
				///////////////Muevo el piso completo

				//Muevo lo seleccionado/////////////////////////
				if (e.getKeyCode() == KeyEvent.VK_UP) {
					desplazarSeleccionado(Direccion.arriba);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_DOWN) {
					desplazarSeleccionado(Direccion.abajo);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_LEFT) {
					desplazarSeleccionado(Direccion.izquierda);
					repaint();
				}
				if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					desplazarSeleccionado(Direccion.derecha);
					repaint();
				}
				//Muevo lo seleccionado/////////////////////////
				
			}
		});
		eeh = new EditorEventHandler(this);

		panel_1 = new JPanel();
		add(panel_1, BorderLayout.NORTH);
		FlowLayout fl_panel_1 = new FlowLayout(FlowLayout.LEFT, 0, 0);
		fl_panel_1.setAlignOnBaseline(true);
		panel_1.setLayout(fl_panel_1);

		JToolBar toolBar = new JToolBar();
		panel_1.add(toolBar);

		JButton btnNuevoEspacio = new JButton("+ Espacio");
		btnNuevoEspacio.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				agregarNuevoEspacio();
				requestFocus();
			}
		});
		btnNuevoEspacio.setMargin(new Insets(0, 0, 0, 0));
		toolBar.add(btnNuevoEspacio);

		JButton btnNuevosPuntos = new JButton("+ Puntos");
		btnNuevosPuntos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				agregarNuevosPuntos();
				requestFocus();
			}
		});
		btnNuevosPuntos.setMargin(new Insets(0, 0, 0, 0));
		toolBar.add(btnNuevosPuntos);

		JButton btnNuevoPortal = new JButton("+ Portal Int");
		btnNuevoPortal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				agregarPortalInterno();
				requestFocus();
			}
		});
		btnNuevoPortal.setMargin(new Insets(0, 0, 0, 0));
		toolBar.add(btnNuevoPortal);

		JButton btnBorrar = new JButton("Borrar");
		btnBorrar.setBackground(new Color(255, 235, 205));
		btnBorrar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				borrarSeleccionado();
				requestFocus();
			}
		});

		JButton btnPortalExt = new JButton("+ Portal Ext");
		btnPortalExt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				agregarPortalExterno();
				requestFocus();
			}
		});
		btnPortalExt.setBackground(new Color(152, 251, 152));
		btnPortalExt.setMargin(new Insets(0, 0, 0, 0));
		toolBar.add(btnPortalExt);
		btnBorrar.setMargin(new Insets(0, 0, 0, 0));
		toolBar.add(btnBorrar);

		JToolBar toolBar_1 = new JToolBar();
		panel_1.add(toolBar_1);

		JLabel label = new JLabel("Alinear-:");
		toolBar_1.add(label);

		JButton btnAlinearIzq = new JButton("Izq");
		btnAlinearIzq.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				alinearPuntos(Direccion.izquierda);
			}
		});
		btnAlinearIzq.setMargin(new Insets(0, 0, 0, 0));
		toolBar_1.add(btnAlinearIzq);

		JButton btnAlinearDer = new JButton("Der");
		btnAlinearDer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				alinearPuntos(Direccion.derecha);
			}
		});
		btnAlinearDer.setMargin(new Insets(0, 0, 0, 0));
		toolBar_1.add(btnAlinearDer);

		JButton btnAlinearArriba = new JButton("Arriba");
		btnAlinearArriba.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				alinearPuntos(Direccion.arriba);
			}
		});
		btnAlinearArriba.setMargin(new Insets(0, 0, 0, 0));
		toolBar_1.add(btnAlinearArriba);

		JButton btnAlinearAbajo = new JButton("Abajo");
		btnAlinearAbajo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				alinearPuntos(Direccion.abajo);
			}
		});
		btnAlinearAbajo.setMargin(new Insets(0, 0, 0, 0));
		toolBar_1.add(btnAlinearAbajo);
		
		JButton btnSp = new JButton("Espacio");
		btnSp.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				alinearSeleccionado(alignEpsilon);
				repaint();
			}
		});
		toolBar_1.add(btnSp);
		
		JButton btnFloor = new JButton("Piso");
		btnFloor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				alinearTodo(alignEpsilon);
				repaint();
			}
		});
		toolBar_1.add(btnFloor);

		JToolBar toolBar_2 = new JToolBar();
		panel_1.add(toolBar_2);

		JLabel label_1 = new JLabel("Unir-:");
		toolBar_2.add(label_1);

		JButton btnUnirIzq = new JButton("Izq");
		btnUnirIzq.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				unirDosPuntos(Direccion.izquierda);
			}
		});
		toolBar_2.add(btnUnirIzq);
		btnUnirIzq.setMargin(new Insets(0, 0, 0, 0));

		JButton btnUnirDer = new JButton("Der");
		btnUnirDer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				unirDosPuntos(Direccion.derecha);
			}
		});
		toolBar_2.add(btnUnirDer);
		btnUnirDer.setMargin(new Insets(0, 0, 0, 0));

		JButton btnUnirArriba = new JButton("Arriba");
		btnUnirArriba.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				unirDosPuntos(Direccion.arriba);
			}
		});
		toolBar_2.add(btnUnirArriba);
		btnUnirArriba.setMargin(new Insets(0, 0, 0, 0));

		JButton btnUnirAbajo = new JButton("Abajo");
		btnUnirAbajo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				unirDosPuntos(Direccion.abajo);
			}
		});
		toolBar_2.add(btnUnirAbajo);
		btnUnirAbajo.setMargin(new Insets(0, 0, 0, 0));
		
		JButton btnPort = new JButton("Portal");
		toolBar_2.add(btnPort);
		btnPort.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ModelUtilities.linkInternalPortals(pisoEnEdicion);
			}
		});

		JToolBar toolBar_3 = new JToolBar();
		panel_1.add(toolBar_3);

		JLabel lblMarcas = new JLabel("Marcas:");
		toolBar_3.add(lblMarcas);

		JButton btnNewLandM = new JButton("+ Marca");
		btnNewLandM.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				agregarNuevoLandMark();
				requestFocus();
			}
		});
		btnNewLandM.setMargin(new Insets(0, 0, 0, 0));
		toolBar_3.add(btnNewLandM);
		
		this.clean();
	}

	protected void agregarUnlinkedPortal() {
		if (seleccion.getSelectedPoints().size() == 1) {
			if (seleccion.getSelectedSpaces().size() == 1) {
				mem.save(pisoEnEdicion);
				EditorSpace space1 = (EditorSpace) seleccion
						.getSelectedSpaces().get(0);

				Point2D pto1 = seleccion.getSelectedPoints().get(0);
				pisoEnEdicion.addNewUnlinkedPortal(space1, pto1);
			//	seleccion.vaciarPuntos();
				this.repaint();
				return;
			}
		}
		JOptionPane.showMessageDialog(this,
				"Debe seleccionar 1 Espacio y un punto");

	}

	protected void alinearSeleccionado(int i) {
		for (Space s : seleccion.getSelectedSpaces()) {
			((EditorSpace)s).alignBorder(i);
			//s.setCentro((int) pos.getX() + difX, (int) pos.getY() + difY);
		}
		
	}

	protected void alinearTodo(int i) {
		for (Space s : pisoEnEdicion.getEspacios()) {
			((EditorSpace)s).alignBorder(i);
			//s.setCentro((int) pos.getX() + difX, (int) pos.getY() + difY);
		}
		
	}

	public void clean() {
		pisoEnEdicion = new EditorFloor();
		pisoEnEdicion.setFloorName("NULO");
		// painter = new Painter2D();
		pisosVisibles.clear();
		estado_ = Estado.inactivo;
		editing = null;

	}

	private Point2D.Float getOffset(Direccion dir){
		int difX, difY;
		int dif = (int)(MAX_ZOOM/(100*getZoom())); //
		switch (dir) {
		case abajo:
			difX = 0;
			difY = dif;
			break;
		case arriba:
			difX = 0;
			difY = -dif;
			break;
		case izquierda:
			difX = -dif;
			difY = 0;
			break;
		case derecha:
			difX = +dif;
			difY = 0;
			break;
		default:
			difX = 0;
			difY = 0;
			break;
		}
		return new Float(difX, difY);
	}
	protected void desplazarFondo(Direccion dir) {
		Point2D.Float pos = getOffset(dir);
		if(fondo!= null) ((DxfModel)fondo).move((int)pos.getX(), (int)pos.getY());
		
	}
	protected void desplazarPisoSeleccionado(Direccion dir) {
		Point2D.Float pos = getOffset(dir);
		if (pisoEnEdicion != null) pisoEnEdicion.move((int)pos.getX(), (int)pos.getY());
		
	}
	protected void desplazarSeleccionado(Direccion dir) {
		Point2D pos = getOffset(dir);
		if(seleccion.isPointSelected())
		for (Point2D p : seleccion.getSelectedPoints()) {
			p.setLocation(pos.getX() + p.getX(), pos.getY() + p.getY());
		}else
		for (Space s : seleccion.getSelectedSpaces()) {
			((EditorSpace)s).move((int)pos.getX(), (int)pos.getY());
			//s.setCentro((int) pos.getX() + difX, (int) pos.getY() + difY);
		}
	}

	protected void pegarSeleccion() {
		for (Space s : seleccion.getSelectedSpaces()) {
			pisoEnEdicion.getEspacios().add(((EditorSpace)s).cloneTo((int)eeh.xMouse, (int)eeh.yMouse));
			pisoEnEdicion.getEspacios().get(pisoEnEdicion.getEspacios().size()-1).setNombrePadreCompleto(pisoEnEdicion.getCompleteFloorName());
			//s.setCentro((int) pos.getX() + difX, (int) pos.getY() + difY);
		}
		
	}

	protected void editarSeleccionado() {
		if (editing == null) {
			EditorViewer.showEdit(new FloorPanel(), pisoEnEdicion);
			//pisoEnEdicion.calculateHeights();
			// return;
		} else if (editing instanceof EditorSpace) {
			EditorViewer.showEdit(new SpacePanel(), (EditorSpace) editing);
		} else if (editing instanceof LandMark) {
			EditorViewer.showEdit(new LandmarkPanel(), (LandMark) editing);
		}else
		if (editing instanceof EditorPortal) {
			EditorViewer.showEdit(new PortalPanel(), (EditorPortal) editing);
			//pisoEnEdicion.calculateHeights();

		}
		repaint();
	}

	protected void botonDerecho(float xMouse, float yMouse) {
		editing = null;
		Point2D.Float p = new Float(xMouse, yMouse);
		editing = seleccion.seleccionarPortal(this.pisoEnEdicion, p);
		if (editing == null) {
			editing = seleccion.seleccionarSpace(this.pisoEnEdicion, p);
		}
		if(editing == null) {
			editing = seleccion.seleccionarLandmark(this.pisoEnEdicion, p);
		}
		// mntmEditar_1.setEnabled(editing != null);
		popupMenu_1.show(this, (int) ((xMouse + origenX) * zoom),
				(int) ((yMouse + origenY) * zoom));
	}

	public void agregarNuevoEspacio() {
		setEstado(Estado.agregarEspacio);
	//	seleccion.vaciar();
		repaint();
	}

	public void agregarNuevosPuntos() {
		setEstado(Estado.agregarPuntos);
		// seleccion.vaciar();
		repaint();
	}

	protected void agregarNuevoLandMark() {
		setEstado(Estado.agregarLandMark);

		repaint();

	}

	public void borrarSeleccionado() {
		this.requestFocus();
		if (seleccion.isPortalSelected()) {
			System.out.println("a borrar un portal");
			mem.save(pisoEnEdicion);
			pisoEnEdicion.getPortales().remove(
					seleccion.getLastSelectedPortal());
			seleccion.vaciarPortals();
		}else if (seleccion.isPointSelected()) {
			if (seleccion.getSelectedPoints().size() >= 1) {
				mem.save(pisoEnEdicion);
				
				//borra solo el portal del ultimo punto!! ojo
				for(Portal por: pisoEnEdicion.getPortales()){
					if(((EditorPortal)por).getPtoSource().equals(seleccion.getLastSelectedPoint())){
						pisoEnEdicion.getPortales().remove(por);
						seleccion.vaciarPortals();
						this.repaint();
						return;
					}
				}
				((EditorSpace) seleccion.getLastSelectedSpace())
						.deletePoint(seleccion.getSelectedPoints());
				seleccion.vaciarPuntos();
			}
		} else if (seleccion.isSpaceSelected()) {
			mem.save(pisoEnEdicion);
			pisoEnEdicion.getEspacios()
					.remove(seleccion.getLastSelectedSpace());
			seleccion.vaciarSpaces();
		} else
			JOptionPane
					.showMessageDialog(this,
							"Debe seleccionar un solo punto o un portal para poder borrar");
		this.repaint();
	}

	public void agregarPortalInterno() {
		this.requestFocus();
		if (seleccion.getSelectedPoints().size() == 2) {
			if (seleccion.getSelectedSpaces().size() == 2) {
				mem.save(pisoEnEdicion);
				EditorSpace space1 = (EditorSpace) seleccion
						.getSelectedSpaces().get(0);
				EditorSpace space2 = (EditorSpace) seleccion
						.getSelectedSpaces().get(1);

				Point2D pto1 = seleccion.getSelectedPoints().get(0);
				Point2D pto2;
				if (space1.getBorde().contains(pto1)) {
					// /////Controlar errores!
					pto2 = seleccion.getSelectedPoints().get(1);
				} else {
					pto1 = seleccion.getSelectedPoints().get(1);
					pto2 = seleccion.getSelectedPoints().get(0);
				}
				pisoEnEdicion.addNewInternalPortal(space1, pto1, space2, pto2);
				seleccion.vaciarPuntos();
				this.repaint();
				return;
			}
		}
		JOptionPane.showMessageDialog(this,
				"Debe seleccionar 2 Espacios y un punto de cada espacio");
		this.repaint();
	}

	protected void agregarPortalExterno() {
		this.requestFocus();
		if (seleccion.getSelectedPoints().size() == 1
				&& seleccion.getSelectedSpaces().size() == 1) {
			mem.save(pisoEnEdicion);
			EditorSpace space1 = (EditorSpace) seleccion.getSelectedSpaces()
					.get(0);
			Point2D pto1 = seleccion.getSelectedPoints().get(0);
			pisoEnEdicion.addNewExternalPortal(space1, pto1);
		} else {
			JOptionPane.showMessageDialog(this,
					"Debe seleccionar 1 Espacio y un punto");
		}
		this.repaint();
	}

	@Override
	public void paintComponent(Graphics g) {
		// super.paint(g);
		//super.paintComponent(g);

		// System.out.println("a pintar"+ getWidth()+ " "+ getHeight());
		g.setColor(COLOR_FONDO);
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(getForeground());
	
		//g.drawString("Piso en edicion: " + pisoEnEdicion.getFloorName(), 8, 30);
	
		AffineTransform original = ((Graphics2D) g).getTransform();
		AffineTransform transform = new AffineTransform();

		transform.scale(zoom, zoom);
		transform.translate(origenX, origenY);
	//	((Graphics2D) g).setStroke(new BasicStroke(1.0f/zoom));
		((Graphics2D) g).setTransform(transform);
		if(fondos != null)
		for(Dibujable d: fondos)
			d.dibujar(((Graphics2D) g));

		g.setColor(COLOR_ORIGEN);
		g.fillOval(0 - (TAMANIO_ORIGEN >> 1), 0 - (TAMANIO_ORIGEN >> 1),
				TAMANIO_ORIGEN, TAMANIO_ORIGEN); // origen

		g.drawLine(0, 0, 2000, 0);
		g.drawLine(0, 0, 0, -2000);
		
		/*int xM = (int)aCoordenadasMundoX((float)MouseInfo.getPointerInfo().getLocation().x);
		int yM = (int)aCoordenadasMundoY((float)MouseInfo.getPointerInfo().getLocation().y);
		g.setColor(new Color(25,255,25));
		g.drawLine(-6000, yM ,	+6000, yM);
		
		g.drawLine( xM, -6000,	xM, +6000);*/

		g.drawString(pisoEnEdicion.getFloorName(), 0, 20);

		
		
		for (EditorFloor visible : pisosVisibles) {
			if (pisosVisibles != pisoEnEdicion)
				painter.dibujarMundo((Graphics2D) g, visible, seleccion,
						getEstado(), eeh.xMouse, eeh.yMouse);
		}
		
		
		((Graphics2D) g).setTransform(original);
		g.setColor(new Color(248, 248, 255, 150));
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(getForeground());
		((Graphics2D) g).setTransform(transform);

		
		painter.dibujarMundo((Graphics2D) g, pisoEnEdicion, seleccion,
				getEstado(), eeh.xMouse, eeh.yMouse);

		((Graphics2D) g).setTransform(original);
		// panel.paintComponents(g);

	}

	public EditorFloor getSelectedFloor() {
		return this.pisoEnEdicion;
	}

	public void setSelectedFloor(EditorFloor piso) {
		this.pisoEnEdicion = piso;
		seleccion.vaciar();
		repaint();
	}

	float aCoordenadasMundoX(float coordX) {
		return Math.round((float) coordX / zoom - origenX);

	}

	float aCoordenadasMundoY(float coordY) {
		return Math.round((float) coordY / zoom - origenY);
	}

	void setEstado(Estado e) {
		// System.out.println("Cambio de estado a "+ e);
		this.estado_ = e;
	}

	public Estado getEstado() {
		return estado_;
	}

	public void setPisoVisible(ArrayList<EditorFloor> pisos) {
		pisosVisibles = pisos;
	}

	/******************* Manejo de puntos ****************/
	public void alinearPuntos(Direccion d) {
		mem.save(pisoEnEdicion);
		switch (d) {
		case derecha:
			PointSorter.alinearDerecha(seleccion.getSelectedPoints());
			break;
		case izquierda:
			PointSorter.alinearIzquierda(seleccion.getSelectedPoints());
			break;
		case abajo:
			PointSorter.alinearAbajo(seleccion.getSelectedPoints());
			break;
		case arriba:
			PointSorter.alinearArriba(seleccion.getSelectedPoints());
			break;
		}
		repaint();
	}

	public void unirDosPuntos(Direccion d) {
		mem.save(pisoEnEdicion);
		switch (d) {
		case derecha:
			PointSorter.unirDerecha(seleccion.getSelectedPoints());
			break;
		case izquierda:
			PointSorter.unirIzquierda(seleccion.getSelectedPoints());
			break;
		case abajo:
			PointSorter.unirAbajo(seleccion.getSelectedPoints());
			break;
		case arriba:
			PointSorter.unirArriba(seleccion.getSelectedPoints());
			break;
		}
		repaint();
	}

	public void setZoom(int zoom) {
		this.zoom = zoom / 100.0f;
		this.repaint();
	}

	public void save() {
		this.mem.save(pisoEnEdicion);
	}
	
	public void setFondo(Dibujable d){
		this.fondo = d;
	}
	public void setFondos(List<DxfModel> list){
		this.fondos = list;
	}

}
